##############################################################################
# chmod Command 速查表 (chmod Command Cheatsheet)
# 修改文件或目录的访问权限 (Change file/directory access permissions)
# https://github.com/funnyzak/cli-cheatsheets
##############################################################################

# 图例 / 术语解释 (Legend / Terminology):
#   MODE:  权限模式 (Permission mode), 可以是八进制数字或符号表示法
#   FILE:  目标文件或目录路径 (Target file or directory path)
#   RFILE: 参考文件路径 (Reference file path)
#
#   符号模式组成 (Symbolic Mode Components):
#     [ugoa...]  用户类别 (Who):
#       u: 用户 (User owner)
#       g: 组 (Group owner)
#       o: 其他人 (Others)
#       a: 所有人 (All - default if omitted)
#
#     [+-=]    操作符 (Operator):
#       +: 添加权限 (Add permission)
#       -: 移除权限 (Remove permission)
#       =: 精确设置权限 (Set permission exactly)
#
#     [rwxXstugo...] 权限 (Permissions):
#       r: 读 (Read)
#       w: 写 (Write)
#       x: 执行 (Execute) / 搜索 (目录 Search)
#       X: 特殊执行权限，仅对目录或已有执行权限的文件添加执行权限
#       s: 设置用户/组ID (SetUID/SetGID)
#       t: 粘滞位 (Sticky bit)
#       u: 复制用户权限 (Copy user's permission)
#       g: 复制组权限 (Copy group's permission)
#       o: 复制其他人权限 (Copy other's permission)
#
#   八进制模式 (Octal Mode):
#     由 3 位或 4 位数字组成 (e.g., 755, 644, 4755)
#     每位代表 u, g, o 的权限组合 (r=4, w=2, x=1)
#     第 4 位 (可选) 代表特殊权限 (SUID=4, SGID=2, Sticky=1)
#     示例: 7 = rwx (4+2+1), 6 = rw- (4+2), 5 = r-x (4+1), 4 = r-- (4)

##############################################################################
# 基本语法 (Basic Syntax)
##############################################################################

chmod [OPTIONS] MODE FILE...                   # 基本格式

##############################################################################
# 符号模式 (Symbolic Mode - Recommended for Clarity)
##############################################################################

# --- 添加权限 (+) ---
chmod u+x FILE                                # 为用户添加执行权限
chmod g+w FILE                                # 为组添加写权限
chmod o+r FILE                                # 为其他人添加读权限
chmod a+x FILE                                # 为所有人添加执行权限 (等同于 +x)
chmod ug+rw FILE                               # 为用户和组添加读写权限
chmod +x FILE                                 # 为所有人添加执行权限 (常用)

# --- 移除权限 (-) ---
chmod u-x FILE                                # 为用户移除执行权限
chmod g-w FILE                                # 为组移除写权限
chmod o-r FILE                                # 为其他人移除读权限
chmod a-x FILE                                # 为所有人移除执行权限 (等同于 -x)
chmod go-w FILE                               # 为组和其他人移除写权限

# --- 精确设置权限 (=) ---
chmod u=rwx FILE                              # 设置用户权限为 rwx
chmod g=rx FILE                               # 设置组权限为 r-x
chmod o=r FILE                                # 设置其他人权限为 r--
chmod a=r FILE                                # 设置所有人权限为 r-- (等同于 =r)
chmod ug=rw,o=r FILE                          # 设置用户/组为 rw-, 其他人为 r-- (等同于 664)

# --- 特殊执行权限 (X) ---
chmod +X FILE                                 # 如果是目录或已有x权限，则添加x权限

# --- 特殊权限 (SUID, SGID, Sticky) ---
chmod u+s FILE                                # 添加 SetUID 位 (执行时具有文件所有者权限)
chmod g+s FILE                                # 添加 SetGID 位 (执行时具有文件组权限 / 目录下文件继承组)
chmod +t DIR                                  # 添加粘滞位 (通常用于 /tmp，只有所有者能删除文件)
chmod u-s,g-s FILE                            # 移除 SUID 和 SGID 位
chmod -t DIR                                  # 移除粘滞位

##############################################################################
# 八进制模式 (Octal Mode - Numeric)
##############################################################################

# --- 常用权限组合 ---
chmod 777 FILE                                # rwxrwxrwx (所有人可读写执行 - 谨慎使用!)
chmod 755 FILE                                # rwxr-xr-x (用户读写执行，组/其他人读执行 - 常用脚本/目录)
chmod 700 FILE                                # rwx------ (仅用户读写执行 - 私密目录/脚本)
chmod 644 FILE                                # rw-r--r-- (用户读写，组/其他人只读 - 常用普通文件)
chmod 664 FILE                                # rw-rw-r-- (用户/组读写，其他人只读)
chmod 600 FILE                                # rw------- (仅用户读写 - 私密文件, 如 SSH key)

# --- 包含特殊权限 ---
chmod 4755 FILE                               # rwsr-xr-x (SetUID + 755)
chmod 2755 FILE                               # rwxr-sr-x (SetGID + 755)
chmod 1777 DIR                                # rwxrwxrwt (Sticky + 777 - 常用 /tmp)

##############################################################################
# 常用选项 (Common Options)
##############################################################################

chmod -R MODE DIR                             # 递归修改目录及其内容的权限
chmod --recursive MODE DIR                    # 同 -R

chmod -v MODE FILE                            # 显示详细处理信息 (Verbose)
chmod --verbose MODE FILE                     # 同 -v

chmod -c MODE FILE                            # 仅在发生更改时显示信息 (Changes)
chmod --changes MODE FILE                     # 同 -c

chmod --reference=RFILE FILE                  # 使用 RFILE 的权限来设置 FILE 的权限

##############################################################################
# 实用技巧 (Tips and Tricks)
##############################################################################

# - 使用 `ls -l FILE` 命令查看文件或目录的当前权限。
# - 对目录需要 `x` 权限才能进入 (`cd`) 或列出其内容 (`ls`)。
# - 对文件需要 `x` 权限才能执行。
# - `chmod 777` 通常是不安全的，应避免在生产环境中使用。
# - 符号模式对于增量修改权限更清晰、更安全。
# - 八进制模式对于设置绝对权限更快捷。

##############################################################################
# 示例 (Examples)
##############################################################################

# 使脚本可执行:
#   chmod +x my_script.sh
#   chmod u+x my_script.sh  # 仅限用户

# 设置标准文件权限:
#   chmod 644 my_document.txt

# 设置标准目录权限:
#   chmod 755 my_directory/

# 递归设置目录权限 (目录 755, 文件 644):
#   find /path/to/dir -type d -exec chmod 755 {} \;
#   find /path/to/dir -type f -exec chmod 644 {} \;

# 设置私钥文件权限:
#   chmod 600 ~/.ssh/id_rsa

# 移除其他人的所有权限:
#   chmod o-rwx FILE

# 复制另一个文件的权限:
#   chmod --reference=template_file new_file

##############################################################################
# 更多资源 (Further Resources)
##############################################################################

# 查看 `chmod` 的 man 手册页获取最详细的信息:
#   man chmod

# vim: set ts=4 sw=4 tw=0 et ft=bash :
